package edu.hebeu.activity;

import android.text.InputFilter;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.HashMap;
import java.util.Map;

import edu.hebeu.R;
import edu.hebeu.entity.RegisterResponse;
import edu.hebeu.entity.SearchUserResponse;
import edu.hebeu.network.API;
import edu.hebeu.network.APIConfig;
import edu.hebeu.network.MyCallback;

public class RegisterActivity extends BaseActivity {

    private EditText et_uname;
    private EditText et_password;
    private EditText et_repassword;
    private Button btn_register;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_register;
    }

    @Override
    protected void initViews() {
        et_uname = (EditText) findViewById(R.id.et_uname);
        et_password = (EditText) findViewById(R.id.et_pwd);
        et_repassword = (EditText) findViewById(R.id.et_repwd);
        btn_register = (Button) findViewById(R.id.btn_register);

        et_uname.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); // 设置该组件的输入最大长度为10位
        et_password.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); // 设置该组件的输入最大长度为20位
        et_repassword.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); // 设置该组件的输入最大长度为20位

        et_uname.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) { // 如果得到焦点时
                } else { // 否则(即失去焦点时)
                    hasUser();
                }
            }
        });
    }

    /**
     * 点击注册按钮触发该方法
     * @param view
     */
    public void registerClick(View view) {
        if (!ver()) {
            return;
        }
        Map<String, Object> params = new HashMap<>();
        params.put("username", et_uname.getText().toString());
        params.put("password", et_password.getText().toString());
        requestRegister(params);
    }

    /**
     * 这个方法用来判断是否存在username的用户
     */
    private void hasUser() {
        String username = et_uname.getText().toString().trim();
        if (username.length() != 10) { // 如果长度不是10
            btn_register.setEnabled(false);
            return; // 结束方法
        }

        Map<String, Object> params = new HashMap<>();
        params.put("username", username);
        requestSearchUser(params);
    }

    /**
     * 这个方法用来发送注册的网络请求
     */
    private void requestRegister(final Map<String, Object> params) {
        API.requestConfig(APIConfig.URL.REGISTER_URL, params, "")
            .postRequest(new MyCallback() {
                @Override
                public void onSuccess(String res) {
                    RegisterResponse registerResponse = (RegisterResponse) deSerialize(res, RegisterResponse.class);
                    if (registerResponse.getCode() == 200) {
                        jumpActivity(LoginActivity.class, true);
                        showToast("用户" + params.get("username") + "，您已注册成功", 0, true); // 显示同步的吐司弹窗放在跳转之后，否则跳转会失效
                    }
                }

                @Override
                public void onFailure(Exception e) {
                    showToast("注册失败！", 0, true);
                }
            }, false);
    }

    /**
     * 这个方法用来发送查询用户的网络请求
     * @param params
     */
    private void requestSearchUser(Map<String, Object> params) {
        API.requestConfig(APIConfig.URL.SEARCH_USER_URL, params, "")
            .getRequest(new MyCallback() {
                @Override
                public void onSuccess(final String res) {
                    //                runOnUiThread(new Runnable() {
                    //                    @Override
                    //                    public void run() {
                    //                        showToast(res, 0, false);
                    //                        btn_register.setEnabled(true);
                    //                    }
                    //                });
                    // 也可以使用Looper保证子线程修改主线程(UI线程)
                    //                    showToast(res, 0, true);
                    SearchUserResponse searchUserResponse = (SearchUserResponse) deSerialize(res, SearchUserResponse.class); // 对JSON串进行反序列化
                    if (searchUserResponse.getCode() == 200) {
                        if (searchUserResponse.getUser() == null) { // 如果用户为空，即该用户名的用户不存在
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    showToast("用户名可用", 0, false);
                                    btn_register.setEnabled(true); // 设置注册按钮可用
                                }
                            });
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    showToast("该用户名已注册！", 0, false);
                                    btn_register.setEnabled(false); // 设置注册按钮不可用
                                }
                            });
                        }
                    }
                }

                @Override
                public void onFailure(Exception e) {
                    //                runOnUiThread(new Runnable() {
                    //                    @Override
                    //                    public void run() {
                    //                        showToast("请求失败！", 0, false);
                    //                    }
                    //                });
                    // 也可以使用Looper保证子线程修改主线程(UI线程)
                    showToast("请求失败！", 0, true);
                }
            }, false);
    }

    /**
     * 这个方法用来验证输入是否合法
     * @return
     */
    private boolean ver() {
        String username = et_uname.getText().toString();
        String password = et_password.getText().toString();
        String repwd = et_repassword.getText().toString();
        if (username.length() != 10) {
            showToast("请保证账号为10位", 0, false);
            btn_register.setEnabled(false);
            return false;
        }
        if (password.isEmpty()) {
            showToast("请输入密码", 0, false);
            btn_register.setEnabled(false);
            return false;
        }
        if (!password.equals(repwd)) {
            showToast("两次密码不一样", 0, false);
            btn_register.setEnabled(false);
            return false;
        }
        return true;
    }

}
